package br.inf.mfpo.fra4and.exemplo;

import java.util.Calendar;
import java.util.Date;

import android.app.DatePickerDialog;
import android.app.Dialog;
import android.content.ContentUris;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.TextView;
import br.inf.mfpo.fra4and.R;
import br.inf.mfpo.fra4and.activities.Fra4AndEditActivity;
import br.inf.mfpo.fra4and.exemplo.columns.CoisasColumns;
import br.inf.mfpo.fra4and.exemplo.columns.PessoasColumns;
import br.inf.mfpo.fra4and.utils.FormatterUtils;

public class CoisasEditActivity extends Fra4AndEditActivity {
	EditText nome;
	EditText aquisicao;
	ImageButton pick;
	TextView pessoas;

	String nomeOr = null;
	long aquOr = -1;
	long pessoaOr = -1;

	int dia;
	int mes;
	int ano;

	final static int DATE_DIALOG = 0;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.example_coisas_edit);

		nome = (EditText) findViewById(R.id.editText1);
		aquisicao = (EditText) findViewById(R.id.editText2);
		pick = (ImageButton) findViewById(R.id.imageButton1);
		pessoas = (TextView) findViewById(R.id.textView4);

		setBtnSave(R.id.button1);
		setBtnCancel(R.id.button2);

		setCreateMessage(R.string.criei);
		setUpdateMessage(R.string.alterei);

		pick.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				showDialog(DATE_DIALOG);
			}
		});
	}

	@Override
	protected void clear() {
		nome.setText("");
		aquisicao.setText(FormatterUtils.formatDate(this, new Date().getTime()));
	}

	@Override
	protected ContentValues getContentValues() {
		final Calendar cal = Calendar.getInstance();
		cal.set(Calendar.YEAR, ano);
		cal.set(Calendar.MONTH, mes);
		cal.set(Calendar.DAY_OF_MONTH, dia);

		final Uri extraUri = getExtraUri(PessoasColumns.CONTENT_URI);
		final String id = extraUri.getPathSegments().get(1);

		ContentValues values = new ContentValues();
		values.put(CoisasColumns.NOME, nome.getText().toString());
		values.put(CoisasColumns.DATA_AQUISICAO, cal.getTimeInMillis());
		values.put(CoisasColumns.PESSOAS_ID, Long.parseLong(id));
		return values;
	}

	@Override
	protected ContentValues getInitialValues() {
		final Uri extraUri = getExtraUri(PessoasColumns.CONTENT_URI);
		final String id = extraUri.getPathSegments().get(1);

		final Calendar cal = Calendar.getInstance();
		ano = cal.get(Calendar.YEAR);
		mes = cal.get(Calendar.MONTH);
		dia = cal.get(Calendar.DAY_OF_MONTH);

		ContentValues values = new ContentValues();
		values.put(CoisasColumns.NOME, "");
		values.put(CoisasColumns.DATA_AQUISICAO, cal.getTimeInMillis());
		values.put(CoisasColumns.PESSOAS_ID, Long.parseLong(id));
		return values;
	}

	@Override
	protected ContentValues getRestoredValues() {
		ContentValues values = new ContentValues();
		values.put(CoisasColumns.NOME, nomeOr);
		values.put(CoisasColumns.DATA_AQUISICAO, aquOr);
		values.put(CoisasColumns.PESSOAS_ID, pessoaOr);
		return values;
	}

	@Override
	protected void populateFields(Cursor cursor) {
		final Calendar cal = Calendar.getInstance();
		cal.setTimeInMillis(cursor.getLong(2));
		ano = cal.get(Calendar.YEAR);
		mes = cal.get(Calendar.MONTH);
		dia = cal.get(Calendar.DAY_OF_MONTH);

		nome.setText(cursor.getString(1));
		long pessoa_id = cursor.getLong(3);

		Uri pessoa = ContentUris.withAppendedId(PessoasColumns.CONTENT_URI, pessoa_id);
		Cursor cPessoa = managedQuery(pessoa, new String[] { PessoasColumns._ID, PessoasColumns.NOME }, null, null, null);
		if (cPessoa.moveToFirst()) {
			pessoas.setText(cPessoa.getString(1));
		}
	}

	@Override
	protected boolean validateFields() {
		if (nome.getText().toString().length() == 0) {
			nome.setError(getString(R.string.requerido));
			return false;
		}
		if (aquisicao.getText().toString().length() == 0) {
			aquisicao.setError(getString(R.string.requerido));
			return false;
		}
		return true;
	}

	@Override
	protected void keepState() {
		final Uri extraUri = getExtraUri(PessoasColumns.CONTENT_URI);
		final String id = extraUri.getPathSegments().get(1);

		final Calendar cal = Calendar.getInstance();
		cal.set(Calendar.YEAR, ano);
		cal.set(Calendar.MONTH, mes);
		cal.set(Calendar.DAY_OF_MONTH, dia);

		if (nomeOr == null) {
			nomeOr = nome.getText().toString();
		}

		if (aquOr == -1) {
			aquOr = cal.getTimeInMillis();
		}

		if (pessoaOr == -1) {
			pessoaOr = Long.parseLong(id);
		}
	}

	@Override
	protected int getInsertTitle() {
		return R.string.inserir;
	}

	@Override
	protected int getEditTitle() {
		return R.string.editar;
	}

	@Override
	protected String[] getProjection() {
		return new String[] { CoisasColumns._ID, CoisasColumns.NOME, CoisasColumns.DATA_AQUISICAO, CoisasColumns.PESSOAS_ID };
	}

	@Override
	protected void restoreState(Bundle savedInstanceState) {
		if (savedInstanceState != null) {
			nomeOr = savedInstanceState.getString(CoisasColumns.NOME);
			aquOr = savedInstanceState.getLong(CoisasColumns.DATA_AQUISICAO);
			pessoaOr = savedInstanceState.getLong(CoisasColumns.PESSOAS_ID);
		}
	}

	@Override
	protected void saveState(Bundle outState) {
		if (isInsert()) {
			final Uri extraUri = getExtraUri(PessoasColumns.CONTENT_URI);
			final String id = extraUri.getPathSegments().get(1);

			nomeOr = nome.getText().toString();
			aquOr = new Date(ano, mes, dia).getTime();
			pessoaOr = Long.parseLong(id);
		}

		outState.putString(CoisasColumns.NOME, nomeOr);
		outState.putLong(CoisasColumns.DATA_AQUISICAO, aquOr);
		outState.putLong(CoisasColumns.PESSOAS_ID, pessoaOr);
	}

	@Override
	protected Dialog onCreateDialog(int id) {
		switch (id) {
		case 0:
			return new DatePickerDialog(this, onDateSetListener, ano, mes, dia);
		default:
			break;
		}

		return null;
	}

	private DatePickerDialog.OnDateSetListener onDateSetListener = new DatePickerDialog.OnDateSetListener() {
		@Override
		public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
			ano = year;
			mes = monthOfYear;
			dia = dayOfMonth;

			final Calendar cal = Calendar.getInstance();
			cal.set(Calendar.YEAR, ano);
			cal.set(Calendar.MONTH, mes);
			cal.set(Calendar.DAY_OF_MONTH, dia);

			aquisicao.setText(FormatterUtils.formatDate(CoisasEditActivity.this, cal.getTimeInMillis()));
		}
	};
}
